package 多线程;

/**
 * Created By  醉美柳舞之众星捧月
 *
 * @author song
 * @date 2017/11/9 16:38
 */
public class 多线程上线程创建SleepYeildJoinInterrupt {

    //  线程  进程

    //两种方法实现多线程:  1.实现Runnable接口 2. 继承Thread类

    // 如果是继承; 那么就只能继承一个 ;   eg : extends Thread
    // 如果是实现 , 那么可以单继承多实现, 非常方便的 ;      eg: implements Runnable,Comparable   可以实现多个接口很灵活
    // 具体看情况而定  ;;;;   不过多数都是实现多个接口
    // 源码是:    public class Thread implements Runnable ; 也就是说 Thread 本身就已经实现了implements     !!!!!!!!!!!!!!!!!!!!!

    public static void main(String[] args) throws InterruptedException {
        //主函数里面是主线程   ;  计算机运行的最小单位就是线程


        Thread t1 = new Thread(new PrintChar实现('A', 50));
        Thread t2 = new Thread(new PrintChar实现('B', 10));
        Thread t5 = new Thread(new PrintNum(100));
        t1.start();
//        t1.setPriority(Thread.MIN_PRIORITY);     //   设置优先级别 ： 当前设置线程很低, 那么基本就是后面再执行这个任务; 放在后面的情况占多数
//        t1.setPriority(Thread.MAX_PRIORITY);     //   设置优先级别 ： 当前设置线程很高,先执行的几率很大  // 默认为一般; Nor******
//        Thread.currentThread().getPriority();   //   获取当前线程对象 ;    获取当前对象的优先级别 ;  优先级别是1-10的常量数字;低在1左右,高在10左右  !!!!!
        t2.start();
        t5.start();


//        PrintChar继承 t3 = new PrintChar继承('C', 20);
//        PrintChar继承 t4 = new PrintChar继承('D', 35);
//        t3.start();
//        t4.start();


        // 线程的启动方式是 Thread的变量.start()方法;  而run方法里面仅仅是写逻辑代码而已而不是启动多线程的方法
        //  线程运行的时候并不是立即运行,而是进入了一种可进行的状态


        for (int i = 0; i < 50; i++) {
            System.out.println(i);
            if (i == 20) {
                t1.join();
                //      当 i执行到 i==20 的时候 ,让 t1 这个线程加入进来
                //   让t1 把任务执行完了再来执行当前的这个线程
            }


            if (i == 45) {
                t1.interrupt();     //  打断      t1.stop() 这种方法已经过期了避免脏数据;
                //     删除了stop方法后新增了interrupt方法; 这个方法并不是终止当前线程,而是设置一个中断标志位
                // interrupt默认状态为false; 当此处调用了这个方法时候,interrupt就为true      ！！！！！！！！！！
                //  interrupt的作用是让t1线程可以休息了后面的可以不用再继续执行了,但是到底会不会执行或者还会再继续执行多少,决定权在t1线程本身自己
            }


            //interrupt的另类使用 ：：：：：：：：
            if (Thread.currentThread().isInterrupted()) {
                break;
                //   当前线程： 是否有人让我停下来, 有的话返回true否则false ;
                // 当 当前线程有调用interrupt(断点标志位)想要停下来, 那么就跳出循环了不再执行后面的内容;
            }


            /**
             *      打断一个线程方法的真正姿势：
             *       interrupt()  和 isInterrupted()  两个配合使用即可;
             *       interrupt()在主函数中调用多线程的时候用线程调用此方法                      是对象的方法
             *       isInterrupted() 在多线程的逻辑代码中判断                                interrupted() ===>>>  Thread的静态的方法
             *
             *        interrupted() ===>>>  Thread的静态的方法      是清除中断标志位;重新置为false; 并返回上一次的中断结果
             */

            //      清除中断标志位  使用方法  :::::
            if (Thread.interrupted()) {    //  获取是否有被中断打过标记
                System.out.println(Thread.currentThread().isInterrupted());   // 改写标记; 将原来的true改写为false打破这个中断标记位继续执行后面打断过后并未执行的内容
            }

        }
    }
}
